package net.siufung.core.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.date.TemporalUtil;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Date;

/**
 * @author 陈建峰
 * @since 2022/4/27 11:17 上午
 */
public class DateTimeUtil extends LocalDateTimeUtil {

    /**
     * 获取当前时间的LocalDateTime对象
     */
    public static LocalDateTime now() {
        return LocalDateTimeUtil.now();
    }

    /**
     * Date转换为LocalDateTime
     * @param date 日期
     * @return LocalDateTime
     */
    public static LocalDateTime convertDateToLdt(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * Date转换为LocalDate
     * @param date 日期
     * @return LocalDate
     */
    public static LocalDate convertDateToLd(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * LocalDateTime转换为Date
     * @param localDateTime LocalDateTime
     * @return Date
     */
    public static Date convertLdtToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * LocalDate转换为Date
     * @param localDate localDate
     * @return Date
     */
    public static Date convertLdToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }
    /**
     * 获取指定日期的毫秒
     * @param localDateTime LocalDateTime
     * @return Long
     */
    public static Long getMilliByLdt(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 获取指定日期的秒
     * @param localDateTime LocalDateTime
     * @return Long
     */
    public static Long getSecondsByLdt(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }

    /**
     * 获取当前时间的LocalDateTime对象的字符串
     * @return String
     */
    public static String formatNow() {
        return LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN);
    }

    /**
     * 获取当前时间的指定格式
     * @param pattern 格式
     * @return String
     */
    public static String formatNow(String pattern) {
        return  LocalDateTimeUtil.format(LocalDateTime.now(), pattern);
    }

    /**
     * 日期加上一个数,根据field不同加不同值, field为ChronoUnit.*
     * @param localDateTime LocalDateTime
     * @param number 增加
     * @param field TemporalUnit
     * @return LocalDateTime
     */
    public static LocalDateTime plus(LocalDateTime localDateTime, long number, TemporalUnit field) {
        return null == localDateTime ? null : localDateTime.plus(number, field);
    }

    /**
     * 日期减去一个数,根据field不同减不同值, field为ChronoUnit.*
     * @param localDateTime LocalDateTime
     * @param number 增加
     * @param field TemporalUnit
     * @return LocalDateTime
     */
    public static LocalDateTime minus(LocalDateTime localDateTime, long number, TemporalUnit field) {
        return null == localDateTime ? null : localDateTime.minus(number, field);
    }

    /**
     * 获取一天的开始时间，2017,7,22 00:00
     * @param localDateTime localDateTime
     * @return 一天的开始时间
     */
    public LocalDateTime getStartLdtOfDay(LocalDateTime localDateTime) {
        return localDateTime.withHour(0).withMinute(0).withSecond(1).withNano(0);
    }

    /**
     * 获取一天的结束时间，2017,7,22 23:59:59.999999999
     * @param localDateTime localDateTime
     * @return LocalDateTime
     */
    public LocalDateTime getEndLdtOfDay(LocalDateTime localDateTime) {
        return localDateTime.withHour(23).withMinute(59).withSecond(59).withNano(999);
    }

    /**
     * 获取两个日期的差
     * @param startDateInclude 开始日期
     * @param endDateExclude  结束日期
     * @param unit 计量单位
     * @return long
     */
    public static long between(LocalDate startDateInclude, LocalDate endDateExclude, ChronoUnit unit) {
        return TemporalUtil.between(startDateInclude, endDateExclude, unit);
    }

}
